package demo4j;

import apijson.JSONResponse;
import apijson.RequestMethod;
import apijson.StringUtil;
import apijson.framework.APIJSONController;
import apijson.framework.APIJSONParser;
import apijson.orm.JSONRequest;
import apijson.orm.exception.ConditionErrorException;
import cn.dev33.satoken.stp.StpUtil;
import com.alibaba.fastjson.JSONObject;
import demo4j.model.Privacy;
import demo4j.utils.WebUtil;
import org.springframework.web.bind.annotation.*;

import static apijson.JSONResponse.*;

/**
 * 请求路由入口控制器，包括通用增删改查接口等，转交给 apijson 的 Parser 来处理
 * 具体见 SpringBoot 文档
 * <a href="https://www.springcloud.cc/spring-boot.html#boot-features-spring-mvc">spring-boot-features-spring-mvc</a>
 * 以及 apijson 通用文档 3.设计规范 3.1 操作方法
 * <a href="https://github.com/Tencent/APIJSON/blob/master/Document.md#3.1">APIJSON</a>
 * <br > 建议全通过HTTP POST来请求:
 * <br > 1.减少代码 - 客户端无需写HTTP GET,PUT等各种方式的请求代码
 * <br > 2.提高性能 - 无需URL encode和decode
 * <br > 3.调试方便 - 建议使用 APIAuto(<a href="http://apijson.cn/api">http://apijson.cn/api</a>) 或 Postman
 *
 * @author Lemon
 */
@RestController
@RequestMapping
public class CommonController extends APIJSONController<Long> {
//    @Resource
//    private UserRepository userRepository;

    /**
     * 增删改查统一接口，这个一个接口可替代 7 个万能通用接口，牺牲一些路由解析性能来提升一点开发效率
     */
    @PostMapping(value = "base/{method}")
    public String crud(@PathVariable String method, @RequestBody String request) {
        return super.crud(method, request, WebUtil.getHttpSession());
    }

    public static final String PRIVACY_ = Privacy.class.getSimpleName();

    /**
     * 登录
     * <pre>
     * {
     * "phone": "13000082001",
     * "password": "1234567"
     * }
     * </pre>
     */
    @PostMapping("login")
    public JSONObject login(@RequestBody String request) throws Exception {
        JSONObject requestObject = APIJSONParser.parseRequest(request);
        String phone = requestObject.getString("phone");
        String password = requestObject.getString("password");
        if (!StringUtil.isPhone(phone)) {
            throw new IllegalArgumentException("手机号不合法！");
        }
        if (!StringUtil.isPassword(password)) {
            throw new IllegalArgumentException("密码不合法！");
        }
        //根据手机号+密码查询用户
        JSONResponse privacyRes = new JSONResponse(new APIJSONParser<>(RequestMethod.GET, false).parseResponse(new JSONRequest(Privacy.builder().phone(phone)._password(password).build())));
        if (!JSONResponse.isSuccess(privacyRes)) {
            return privacyRes;
        }
        Privacy privacy = privacyRes.getObject(PRIVACY_, Privacy.class);
        if (privacy == null) {
            return APIJSONParser.newErrorResult(new ConditionErrorException("账号或密码错误"));
        }
        //1. 原版登录，基于APIJSON
        // User user = userRepository.findById(privacy.getId());
        // super.login(WebUtil.getHttpSession(), user, 1, true, new JSONObject());
        //2. 基于sa-token登录实现
        StpUtil.login(privacy.getId());
        JSONResponse res = new JSONResponse();
        res.put(KEY_OK, true);
        res.put(KEY_CODE, CODE_SUCCESS);
        res.put(KEY_MSG, MSG_SUCCEED);
        res.put("token", StpUtil.getTokenValue());
        return res;
    }
}